# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------------
# Nombre:       barraTitulo.py
# Autor:        Miguel Andres Garcia Niño
# Creado:       12 de Mayo 2018
# Modificado:   12 de Mayo 2018
# Copyright:    (c) 2018 by Miguel Andres Garcia Niño, 2018
# License:      Apache License 2.0
# ----------------------------------------------------------------------------

__versión__ = "1.0"

"""
El módulo *barraTitulo* tiene como objetivo mostrar una Barra de Título personalizada.
"""

from PyQt5.QtGui import QPalette, QPixmap, QResizeEvent, QMouseEvent
from PyQt5.QtCore import Qt, QPoint, QSize
from PyQt5.QtWidgets import (QApplication, QDialog, QVBoxLayout, QWidget, QPushButton, QFrame,
                             QLabel, QToolButton, QHBoxLayout, QStyle)


# ===================== CLASE barraTitulo ==========================

class barraTitulo(QWidget):
    def __init__(self, parent):
        super(barraTitulo, self).__init__()
        
        self.parent = parent

        self.initUI()

    def initUI(self):

      # ======================= ESTILOS ==========================

        fuenteTitulo = self.font()
        fuenteTitulo.setPointSize(10)

        colorFrame = self.palette()
        colorFrame.setColor(QPalette.Background, Qt.yellow)

      # ======================= WIDGETS ==========================
      
        self.frameTitulo = QFrame()
        self.frameTitulo.setFrameStyle(QFrame.NoFrame)
        self.frameTitulo.setFixedHeight(30)
        self.frameTitulo.setAutoFillBackground(True)
        self.frameTitulo.setPalette(colorFrame)

        labelIcono = QLabel()
        labelIcono.setPixmap(QPixmap("icono.png").scaled(18, 18, Qt.KeepAspectRatio,
                                                         Qt.SmoothTransformation))
        labelIcono.setAlignment(Qt.AlignCenter)
        labelIcono.setToolTip("Icono")
        labelIcono.setFixedWidth(32)
        labelIcono.setFixedHeight(24)
        
        self.labelTitulo = QLabel("Barra de título por: ANDRES NIÑO")
        self.labelTitulo.setAlignment(Qt.AlignCenter)
        self.labelTitulo.setFont(fuenteTitulo)
        self.labelTitulo.setToolTip("Título")

        buttonMinimizar = QToolButton()
        buttonMinimizar.setToolTip("Minimizar")
        buttonMinimizar.setIconSize(QSize(38, 25))
        buttonMinimizar.setAutoRaise(True)
        buttonMinimizar.setIcon(QApplication.style().standardIcon(QStyle.SP_TitleBarMinButton))

        self.buttonMaxRes = QToolButton()
        self.buttonMaxRes.setToolTip("Maximizar")
        self.buttonMaxRes.setIconSize(QSize(38, 25))
        self.buttonMaxRes.setAutoRaise(True)
        self.buttonMaxRes.setIcon(QApplication.style().standardIcon(QStyle.SP_TitleBarMaxButton))

        buttonCerrar = QToolButton()
        buttonCerrar.setToolTip("Cerrar")
        buttonCerrar.setIconSize(QSize(38, 25))
        buttonCerrar.setAutoRaise(True)
        buttonCerrar.setIcon(QApplication.style().standardIcon(QStyle.SP_TitleBarCloseButton))

      # ===================== DISEÑO (LAYOUT) ====================

        disenioFrame = QHBoxLayout()
        disenioFrame.setSpacing(0)
        disenioFrame.addWidget(labelIcono)
        disenioFrame.addWidget(self.labelTitulo)
        disenioFrame.addWidget(buttonMinimizar)
        disenioFrame.addWidget(self.buttonMaxRes)
        disenioFrame.addWidget(buttonCerrar)
        disenioFrame.setContentsMargins(0, 0, 0, 0)

        self.frameTitulo.setLayout(disenioFrame)

        disenioFinal = QHBoxLayout()
        disenioFinal.addWidget(self.frameTitulo)
        disenioFinal.setContentsMargins(0, 0, 0, 0)

        self.setLayout(disenioFinal)

      # ==========================================================

        self.start = QPoint(0, 0)
        self.pressing = False

      # ================== EVENTOS QPUSHBUTTONS ==================

        buttonMinimizar.clicked.connect(self.Minimizar)
        self.buttonMaxRes.clicked.connect(self.maximizarRestaurar)
        buttonCerrar.clicked.connect(self.Cerrar)

  # ======================= FUNCIONES ============================

    def resizeEvent(self, QResizeEvent):
        super(barraTitulo, self).resizeEvent(QResizeEvent)
        self.frameTitulo.setFixedWidth(self.parent.width())
        self.labelTitulo.setFixedWidth(self.parent.width()-62)
        
    def mousePressEvent(self, event):
        self.start = self.mapToGlobal(event.pos())
        self.pressing = True

    def mouseMoveEvent(self, event):
        if self.pressing:
            self.end = self.mapToGlobal(event.pos())
            self.movement = self.end - self.start
            self.parent.setGeometry(self.mapToGlobal(self.movement).x(),
                                    self.mapToGlobal(self.movement).y(),
                                    self.parent.width(), self.parent.height())
            self.start = self.end

    def mouseReleaseEvent(self, QMouseEvent):
        self.pressing = False

    def mouseDoubleClickEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            if self.parent.isMaximized():
                self.parent.showNormal()
                self.buttonMaxRes.setIcon(QApplication.style().standardIcon(QStyle.SP_TitleBarMaxButton))
                self.buttonMaxRes.setToolTip("Maximizar")
            else:
                self.parent.showMaximized()
                self.buttonMaxRes.setIcon(QApplication.style().standardIcon(QStyle.SP_TitleBarNormalButton))
                self.buttonMaxRes.setToolTip("Restaurar")

    def Minimizar(self):
        self.parent.showMinimized()

    def maximizarRestaurar(self):
        if self.parent.isMaximized():
            self.parent.showNormal()
            self.buttonMaxRes.setIcon(QApplication.style().standardIcon(QStyle.SP_TitleBarMaxButton))
            self.buttonMaxRes.setToolTip("Maximizar")
        else:
            self.parent.showMaximized()
            self.buttonMaxRes.setIcon(QApplication.style().standardIcon(QStyle.SP_TitleBarNormalButton))
            self.buttonMaxRes.setToolTip("Restaurar")

    def Cerrar(self):
        self.parent.close()


# =================== CLASE ventanaPrincipal =======================

class ventanaPrincipal(QDialog):
    def __init__(self, parent=None):
        super(ventanaPrincipal, self).__init__(parent)

        self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowSystemMenuHint)
        self.setMinimumSize(800, 400)
        self.pressing = False

        # Aplicar Barra de Título personalizada
        tituloBarra = QVBoxLayout()
        tituloBarra.addWidget(barraTitulo(self))
        tituloBarra.setContentsMargins(0, 0, 0, 0)
        tituloBarra.addStretch(-1)

        self.setLayout(tituloBarra)

        self.initUI()

    def initUI(self):

      # ======================= WIDGETS ==========================

        button = QPushButton("Desarrollo avanzado de GUI (PyQt5) en Python", self)
        button.setGeometry(15, 45, 300, 28)

# ================================================================

if __name__ == '__main__':
    
    import sys
    
    aplicacion = QApplication(sys.argv)
    
    ventana = ventanaPrincipal()
    ventana.show()
    
    sys.exit(aplicacion.exec_())